#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define DIM 5
#define MAX_VALUE 500

typedef struct triplet
{
    int data; // 存储数据
    int x;    // 坐标x
    int y;    // 坐标y
} triplet;

typedef struct TSMatrix
{
    struct triplet element[MAX_VALUE];
    int m, n, num; // 分别代表行,列,非零元个数
} TSMatrix;

void show_TSMatrix(TSMatrix *tsMatrix)
{
    printf("----------------------输出三元组-----------------------\n");
    for (int i = 0; i < tsMatrix->num; i++)
    {
        printf("(%d,%d) %d\n", tsMatrix->element[i].x, tsMatrix->element[i].y, tsMatrix->element[i].data);
    }
    printf("----------------------输出三元组结束-----------------------\n");
}

void show_Matrix(int matrix[][DIM])
{
    printf("----------------------输出矩阵-----------------------\n");

    for (int i = 0; i < DIM; i++)
    {
        for (int j = 0; j < DIM; j++)
        {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    printf("----------------------输出矩阵结束-----------------------\n");
}

void reshape(TSMatrix *M, TSMatrix *T)
{
    // 首先更换行与列,非零元数目不变
    T->num = M->num;
    T->m = M->n;
    T->n = M->m;
    // 使用循环达到转制的目的
    int q = 0;
    for (int i = 0; i < DIM; i++) // 这个DIM数值上等于M的列,即T的行(含义是对T的每一行进行循环)[这里需要着重理解]
    {
        for (int j = 0; j < T->num; j++) // 对所有非零元进行扫描,判断他是不是T的第i行的元素
        {
            if (i == M->element[j].y)
            {
                T->element[q].y = M->element[j].x;
                T->element[q].x = M->element[j].y;
                T->element[q].data = M->element[j].data;
                q++;
            }
        }
    }
}

int main()
{
    // 建立一个矩阵
    int matrix[DIM][DIM] =
        {
            {1, 2, 0, 4, 0},
            {0, 0, 1, 0, 0},
            {0, 0, 5, 0, 0},
            {4, 3, 0, 0, 3},
            {5, 0, 0, 0, 7}};

    show_Matrix(matrix);

    // 初始化一个三元表指针
    TSMatrix *M = (TSMatrix *)malloc(sizeof(TSMatrix));

    // 扫描矩阵,把矩阵非零元存储到三元表内
    int q = 0;
    for (int i = 0; i < DIM; i++)
    {
        for (int j = 0; j < DIM; j++)
        {
            if (matrix[i][j] != 0)
            {
                M->element[q].x = i;
                M->element[q].y = j;
                M->element[q].data = matrix[i][j];
                q++; // 计数器加一
            }
        }
    }
    M->m = DIM; // 默认方阵
    M->n = DIM; // 默认方阵
    M->num = q; // 存放非零元数量

    // 输出三元表
    show_TSMatrix(M);

    // 进行转制
    printf("[----------------------进行转制-----------------------]\n");

    TSMatrix *T = (TSMatrix *)malloc(sizeof(TSMatrix));
    reshape(M, T); // T为转制后的M

    show_TSMatrix(T);

    // 输出三元组解压后的矩阵(默认方阵)
    int new_Matrix[DIM][DIM] = {0};
    for (int i = 0; i < T->num; i++)
    {
        new_Matrix[T->element[i].x][T->element[i].y] = T->element[i].data;
    }
    show_Matrix(new_Matrix);
    return 0;
}